/**
 * 此类是一个转换器，将给入的二进制chunk转换为字符串
 */
class Uint8ArrayToStringsTransformer {
  constructor() {
    this.decoder = new TextDecoder();
    this.lastString = '';
  }

  /**
   * 接收下一个Uint8Array数据块并转化
   * @param {Uint8Array} chunk 下一个二进制数据块
   * @param {TransformStreamDefaultController} controller 转换后的快要放入的队列的控制器
   */
  transform(chunk, controller) {
    console.log('Received chunk %o with %d bytes', chunk, chunk.byteLength);

    // 解码当前chunk成字符串并准备最终字符串
    const string = `${this.lastString}${this.decoder.decode(chunk)}`;

    // 从chunk中分离行
    const lines = string.split(/\r\n|[\r\n]/g);

    // 保存最后的行，因为它可能不完整
    this.lastString = lines.pop() || '';

    // 将每行数据入队到下一个chunk
    for(const line of lines) {
      controller.enqueue(line);
    }
  }

  flush(controller) {
    // 判断最后一行是否存在，若存在则入栈
    if (this.lastString) {
      controller.enqueue(this.lastString);
    }
  }
}